//
//  NewsAndProtocal.swift
//  Enum实践
//
//  Created by 我演示 on 2020/5/13.
//  Copyright © 2020 Jerry-Fu. All rights reserved.
//

import UIKit

// 属性和方法的定义

// 将来可以执行某些属性的计算 - 用法在开发过程中进行处理

enum Wrapper {
    enum Weight :Int {
        case Light = 1
    }
    enum Armor :Int {
        case Light = 2
    }
    
    case Helmet (weight : Weight , armor: Armor)
    
    func attributes() -> (weight: Int , armor:Int) {
        switch self {
        case .Helmet(let w ,  let a ) : return (weight : w.rawValue , armor: a.rawValue )
        }
    }
}

let  woodenHelmentProos = Wrapper.Helmet(weight: Wrapper.Weight.Light, armor: Wrapper.Armor.Light).attributes()



// 枚举中的方法为每一个enum case而“生”。所以倘若想要在特定情况执行特定代码的话，你需要分支处理或采用switch语句来明确正确的代码路径。
// 上一句话的意思就是，每一个enmu 中的case 属性，将来如果在enum 中定义了对应的方法，那么这个方法，就是针对每一个 case的属性，可以执行不同的wswitch 操作 - 2020.05.13  同时也是 可以拆分属性和对应的方法
enum Device {
    case iPad , iphone  , AppleTv , AppleWatch
    
    func introduct() -> String {
        switch self {
        case .AppleTv:
            return "appletv"
        default:
            return "None"
          
        }
    }
}

let dev = Device.iPad.introduct()
//print(Device.iPad.introduct())


// 虽然给enum添加属性不允许，但是可以的是，你可以给添加计算属性
enum DeviceFirst {
    
    case iPad , iphone  , AppleTv , AppleWatch
    var year: Int {
        switch self {
        case .iPad:
            return 200
        default:
            return 100
            break
        }
    }
}


// 可以为枚举，添加对应的静态方法 定义为可变的类型
enum DeviceSecond {
    case ipad
    static func funcString(termString: String) -> DeviceSecond? {
        if termString == "str" {
            return .ipad
        }
        return nil
        
    }
}
let showDate = DeviceSecond.funcString(termString: "str")
 
// 6 生命可变的方法 方法可以声明为mutating。这样就允许改变隐藏参数self的case值了
enum TriStateSwitch {
    case Off, Low, High
    mutating func next() {
    switch self {
    case .Off:
        self = .Low
    case .Low:
        self = .High
    case .High:
        self = .Off
    }
    }
}
var ovenLight = TriStateSwitch.Low
var overRight =  ovenLight.next()
// ovenLight 现在等于.On
//ovenLight.next()
// ovenLight 现在等



//  小结(To Recap)
